﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;

namespace SpaceInvaders_LeonardoCamelo
{
    class BaseStage : Scene //Classe de fase base, deriva de Scene.
    {
        public Background stageBG; //Background da fase.
        public Player player; //Personagem do jogador.
        public Bullet bulletPlayer; //Projetil padrão do player.
        public Bullet bulletEnemy; //Projetil padrão do enemy.
        public List<Enemy> enemyList; //Lista de inimigos.
        public Enemy enemy; //Inimigo padrão.
        public int enemyNumber; //Número de inimigos na fase.
        public List<Bullet> enemyBulletList; //Lista de projeteis dos inimigos.
        public Random alea; //Variável aleatoria.

        //Metodo construtor da classe.
        public BaseStage(Game game) : base(game)
        {
            //Carregamos o personagem.
            this.player = new Player(new Rectangle(400, 530, 70, 70), game.Content.Load<Texture2D>(@"Imagens\personagem"), new Vector2(5, 5));
            //Carregamos o projetil padrão do player.
            this.bulletPlayer = new Bullet(new Rectangle(0, 0, 10, 10), game.Content.Load<Texture2D>(@"Imagens\tiro"), new Vector2(0, -3));
            //Carregamos o projetil padrão do enemy.
            this.bulletEnemy = new Bullet(new Rectangle(0, 0, 10, 10), game.Content.Load<Texture2D>(@"Imagens\tiro2"), new Vector2(0, 3));
            //Carregamos a lista de inimigos.
            this.enemyList = new List<Enemy>();
            //Carregamos o inimigo padrão.
            this.enemy = new Enemy(new Rectangle(0, 0, 70, 70), game.Content.Load<Texture2D>(@"Imagens\inimigoo"), new Vector2(3, 7), 40);
            //Carregamos a lista de projeteis inimigos.
            this.enemyBulletList = new List<Bullet>();
            //Carregamos a variável aleatoria.
            this.alea = new Random();
        }

        //Metodo usado para atualizações no objeto.
        public override void Update(GameTime gameTime)
        {
            //Guardamos a tecla utilizada pelo usuário.
            keyNow = Keyboard.GetState();

            //Update do personagem.
            player.Update(keyNow, WIDTH, HEIGHT);
            //Tiros do personagem.
            player.Shot(keyNow, bulletPlayer);
            //Update dos projeteis do personagem.
            foreach (Bullet n in player.bulletList)
                n.Update();

            foreach (Enemy n in enemyList)
            {
                //Update dos inimigos.
                n.Update();
                //Tiros dos inimigos.
                if (alea.Next(1, 201) == 1)
                    //Adicionamos um projetil.
                    enemyBulletList.Add(new Bullet(new Rectangle(n.rectanglePicture.X + 10, n.rectanglePicture.Bottom,
                                                            bulletEnemy.rectanglePicture.Width, bulletEnemy.rectanglePicture.Height),
                                                            bulletEnemy.texture, bulletEnemy.speed));
            }
            //Update dos projeteis dos enemys.
            foreach (Bullet n in enemyBulletList)
                n.Update();

            //Se o projetil do personagem sair da tela sair da tela, removemos ele da lista.
            for (int n = 0; n < player.bulletList.Count; n++)
            {
                if (player.bulletList[n].rectanglePicture.Bottom < 0)
                    player.bulletList.RemoveAt(n);
            }
            //Se o projetil do inimigo sair da tela sair da tela, removemos ele da lista.
            for (int n = 0; n < enemyBulletList.Count; n++)
            {
                if (enemyBulletList[n].rectanglePicture.Top > HEIGHT)
                    enemyBulletList.RemoveAt(n);
            }

            //Interseção bullets<->player.
            for (int y = 0; y < enemyBulletList.Count; y++)
            {
                //Se o personagem for atingido por um tiro, dá gameover.
                if (enemyBulletList[y].GetBounding().Intersects(player.GetBounding()))
                    SceneManager.ChangeScene(Game, GameState.GameOver);
            }
            //Interseção bullets<->enemys.
            for (int y = 0; y < player.bulletList.Count; y++)
            {
                //Criamos uma bool para remoção de bullets e definimos ela como falsa.
                bool removebullet = false;
                for (int x = 0; x < enemyList.Count; x++)
                {
                    //Se algum bullet colidir com algum enemy.
                    if (player.bulletList[y].GetBounding().Intersects(enemyList[x].GetBounding()))
                    {
                        enemyList.RemoveAt(x); //Removemos o enemy que foi acertado.
                        removebullet = true; //Definimos o removebullet como verdadeiro.
                    }
                }
                //Se removebullet = verdadeiro.
                if (removebullet)
                    player.bulletList.RemoveAt(y); //Removemos o bullet que acertou o enemy.
            }
            //Interseção enemys<->player.
            for (int y = 0; y < enemyList.Count; y++)
            {
                //Se o personagem for atingido por um inimigo ou o inimigo fugir do personagem, dá gameover.
                if (enemyList[y].GetBounding().Intersects(player.GetBounding()) || enemyList[y].rectanglePicture.Top > HEIGHT)
                    SceneManager.ChangeScene(Game, GameState.GameOver);
            }

            base.Update(gameTime);
        }

        //Metodo usado para desenhar.
        public override void Draw(GameTime gameTime)
        {
            //Iniciamos a ferramenta de desenho.
            spriteBatch.Begin();
            //Desenhamos o personagem.
            player.Draw(spriteBatch);
            //Desenhamos os projeteis do personagem.
            foreach (Bullet n in player.bulletList)
                n.Draw(spriteBatch);
            //Desenhamos os projeteis dos inimigos.
            foreach (Bullet n in enemyBulletList)
                n.Draw(spriteBatch);
            //Finalizamos a ferramenta de desenho.
            spriteBatch.End();

            base.Draw(gameTime);
        }

        //Metodo que adiciona inimigos na posição escolhida.
        public void AddEnemy(Vector2 position)
        {
            if(enemyList.Count < enemyNumber)
                this.enemyList.Add(new Enemy(new Rectangle((int)position.X, (int)position.Y,
                                         enemy.rectanglePicture.Width, enemy.rectanglePicture.Height),
                                         enemy.texture, enemy.speed, enemy.escopoMax));
        }
    }
}
